﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using mepostras.BLL;

namespace mepostras.BO
{
    public interface IArticleBo
    {
        /// <summary>
        /// Render từ Id thành chuỗi để lưu LocalId. 
        /// Ex: 1 => ART00001
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        string RenderLocalId(int id);

        /// <summary>
        /// Insert Article
        /// </summary>
        /// <param name="article"></param>
        /// <param name="messageCode">Mã nội dung trả về</param>
        /// <returns></returns>
        bool Insert(Article article, out string messageCode);

        /// <summary>
        /// Update Article
        /// </summary>
        /// <param name="article"></param>
        /// <param name="messageCode">Mã nội dung trả về</param>
        /// <returns></returns>
        bool Update(Article article, out string messageCode);

        /// <summary>
        /// Save Article
        /// </summary>
        /// <param name="article"></param>
        /// <param name="messageCode">Mã nội dung trả về</param>
        /// <returns></returns>
        bool Save(Article article, out string messageCode);

        /// <summary>
        /// Delete Article
        /// </summary>
        /// <param name="article"></param>
        /// <param name="messageCode">Mã nội dung trả về</param>
        /// <returns></returns>
        bool Delete(Article article, out string messageCode);

        /// <summary>
        /// Delete Article
        /// </summary>
        /// <param name="articleId"></param>
        /// <param name="messageCode">Mã nội dung trả về</param>
        /// <returns></returns>
        bool Delete(int articleId, out string messageCode);

        /// <summary>
        /// Lấy 1 bài viết giới thiệu. Bài viết này được lưu trong Setting
        /// Cái này sẽ làm sau
        /// </summary>
        /// <param name="language">Ngôn ngữ</param>
        /// <returns></returns>
        Article GetAbout(string language);

        /// <summary>
        /// Lấy danh sách bài mới nhất ở trang chủ
        /// </summary>
        /// <param name="number">Số tin muốn lấy. Nếu giá trị Null thì sẽ mặc định lấy n tin được cấu hình trong Setting</param>
        /// <param name="language">Ngôn ngữ</param>
        /// <returns></returns>
        TList<Article> GetHomeLatestNews(int? number, string language);

        /// <summary>
        /// Lấy danh sách bài mới nhất ở trang chủ
        /// </summary>
        /// <param name="alias">Alias của menu cần lấy tin</param>
        /// <param name="language">Ngôn ngữ</param>
        /// <param name="page">Thứ tự trang. Trang bắt đầu là 1. Nếu trang là null thì là 1</param>
        /// <param name="isMore">Còn trang tiếp theo không</param>
        /// <param name="menu"></param>
        /// <returns></returns>
        TList<Article> GetNews(string alias, string language, ref int? page, out bool isMore, out Menu menu);

        /// <summary>
        /// Lấy danh sách bài viết cùng mục
        /// </summary>
        /// <param name="articleId">Id của bài viết đang xem. Để tránh lấy bài viết hiện tại vào list</param>
        /// <param name="menuId">Menu loại tin để lấy</param>
        /// <param name="publishedDate">Thời gian của bài viết hiện tại. Nếu null thì là ngày hiện tại</param>
        /// <param name="newerArticles">Danh sách tin trả về mới hơn</param>
        /// <param name="olderArticles">Danh sách tin trả về cũ hơn</param>
        void GetRelatedNews(int articleId, int? menuId, DateTime? publishedDate, out TList<Article> newerArticles,
                            out TList<Article> olderArticles);

        /// <summary>
        /// Lấy bài viết theo alias
        /// </summary>
        /// <param name="alias"></param>
        /// <param name="language"></param>
        /// <returns></returns>
        Article Get(string alias, string language);

        /// <summary>
        /// Lấy bài viết theo alias
        /// </summary>
        /// <param name="alias"></param>
        /// <returns></returns>
        Article Get(string alias);

        /// <summary>
        /// Lấy bài viết theo id
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Article Get(int id);

        /// <summary>
        /// Lấy tất cả bài viết
        /// </summary>
        /// <returns></returns>
        TList<Article> GetAll();

        /// <summary>
        /// Lấy danh sách bài viết theo menu id
        /// </summary>
        /// <returns></returns>
        TList<Article> GetByMenuId(int id);
    }
}
